home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 6 / QRZ Ham Radio Callsign Database - Volume 6.iso / mac / files / amiga / csrc720j.lzh / mbinit.c < prev    next >
C/C++ Source or Header  |  1993-04-13  |  18KB  |  832 lines

  1. /*
  2.  *  MBINIT.C - 06/28/92 - Read configuration file.
  3.  */
  4.  
  5. #include "mb.h"
  6.  
  7. #ifdef MCH_AMIGA
  8. #include <exec/memory.h>
  9. extern char *ser_dev_name;
  10. extern long unit;
  11. char dev_name[20];
  12. extern char tmpstr[];
  13. extern int numpass,debug;
  14. extern int ln_jstr;
  15. extern char *vers;
  16.  
  17.  
  18. /* Current options.
  19. NOTE: You can't use this to control options in the opening of windows
  20.       or the serial line etc. because they are opened BEFORE the init()
  21.       routine is called, which is where these flags are initially set.
  22.    0  A  Reject unwanted bulletins if there's no bbs.dis file.
  23.    1  B  Replace @bbs field with content of user BBS if they are on file.
  24.    2  C  Prevent use of FBB compression which requires transparent mode.
  25.    3  D  Open the window without borders ... for those, like me, that
  26.          like a full-width 80 column screen
  27.    4  E  Turn off interflag so that users can't abort output (just in case
  28.          there's a bug).  
  29.    5  F  Don't show any titles at all in the window.
  30.    6  G  Don't use REXX ... usually for older Kickstarts (1.3) that don't
  31.          have it.
  32. */
  33.  
  34. /* There should be NUMOPTS ones in the initialization of optflags */
  35. #define NUMOPTS 10
  36. char optflags[NUMOPTS] = {1,1,1,1,1,1,1,1,1,1};
  37. extern char hostport;
  38. #endif
  39.  
  40. #define minheap 8192
  41. #define minscr  4096
  42. #define maxscr  14336
  43.  
  44. /*
  45.  *  Read one line from the configuration file.
  46.  *  The first field is a number. Return it.
  47.  */
  48.  
  49. rdnumb()
  50. {
  51.   fgets (port->line, linelen, port->fl);
  52.   parse ();
  53.   return atoi (port->fld[0]);
  54. }
  55.  
  56. /*
  57.  *  Read one line from the configuration file.
  58.  *  The first field is a YES / NO keyword.
  59.  *  Return true if Y, false if N.
  60.  */
  61.  
  62. kw()
  63. {
  64.   fgets(port->line, linelen, port->fl);
  65.   parse();
  66.   return(*port->fld[0] is 'Y');
  67. }
  68.  
  69. /*
  70.  *  Read one line from the configuration file.
  71.  *  The first field is a letter.
  72.  *  Return the control character corresponding to that letter.
  73.  */
  74.  
  75. char cchr()
  76. {
  77.   fgets (port->line, linelen, port->fl);
  78.   return (*port->line - 64);
  79. }
  80.  
  81. /*
  82.  *  Read one line from the configuration file.
  83.  *  Squirrel it away in allocated memory.
  84.  *  Return a pointer to it.
  85.  */
  86.  
  87. char *rdstr()
  88. {
  89.   fgets (port->line, linelen, port->fl);
  90.   return strdup(port->line);
  91. }
  92.  
  93. /*
  94.  *  Read a line from the configuration file.
  95.  *  Remove the new line at end.
  96.  *  Squirrel it away in allocated memory.
  97.  *  Return a pointer to it.
  98.  */
  99.  
  100. char *rdstrnl()
  101. {
  102.   fgets (port->line, linelen, port->fl);
  103.   remnl(port->line);
  104.   return strdup(port->line);
  105. }
  106.  
  107. /*
  108.  *  Read multiple lines from the configuration file, until "*** EOF".
  109.  *  Squirrel them away in allocated memory in MLM structure.
  110.  *  Return a pointer to the structure.
  111.  */
  112.  
  113. MLM *rdmstr()
  114. {
  115.   register MLM *h, *m, *t;
  116.  
  117.   h = NULL;
  118.   fgets (port->line, linelen, port->fl);
  119.   while (!iseof(port->line))
  120.   {
  121.     m = (MLM *) malloc(sizeof(MLM));
  122.     if (h is NULL) h = m; else t->next = m;
  123.     m->next = NULL;
  124.     t = m;
  125.     m->text = strdup(port->line);
  126.     fgets(port->line, linelen, port->fl);
  127.   }
  128.   return h;
  129. }
  130.  
  131. /*
  132.  *  Read multiple lines from the hold file.
  133.  *  Build the message hold list.
  134.  */
  135.  
  136. rdhold()
  137. {
  138.   register HOLD *hp;
  139.   FILE *holdfl;
  140.   hold = NULL;
  141.   if ((holdfl = fopen("HOLD.MB", "r")) is NULL)
  142.   {
  143.      printf("No Hold File\n");
  144.      return;
  145.   }
  146.   printf("Held Calls ");
  147.   while (fgets (port->line, linelen, holdfl))
  148.   {
  149.     hp = (HOLD *)malloc(sizeof(HOLD));
  150.     hp->next = hold; hold = hp;
  151.     parse();
  152.     printf("%s ", port->fld[0]);
  153.     pcall(hp->call, port->fld[0]);
  154.   }
  155.   fclose(holdfl);
  156.   printf("\n");
  157. }
  158.  
  159. /*
  160.  *  Read multiple lines from the configuration file, until "*** EOF".
  161.  *  Build the @ BBS translation list.
  162.  */
  163.  
  164. rdxbbs()
  165. {
  166.   register XBBS *xp;
  167.  
  168.   xbbs = NULL;
  169.   fgets (port->line, linelen, port->fl);
  170.   while (!iseof(port->line))
  171.   {
  172.     xp = (XBBS *)malloc(sizeof(XBBS));
  173.     xp->next = xbbs; xbbs = xp;
  174.     parse();
  175.     pcall(xp->from, port->fld[0]);
  176.  
  177.     if (port->flds is 1) fill(xp->to, ' ', ln_call);
  178.     else pcall(xp->to, port->fld[1]);
  179.  
  180.     fgets (port->line, linelen, port->fl);
  181.   }
  182. }
  183.  
  184. /*
  185.  *  Read the directory path section of the configuration file.
  186.  */
  187.  
  188. rdpaths()
  189. {
  190.   register DIRPATH *p, *path;
  191.   register char *st;
  192.  
  193.   dphd = NULL;
  194.   fgets(port->line, linelen, port->fl);
  195.   while (!iseof(port->line))
  196.   {
  197.     path = (DIRPATH *) malloc(sizeof(DIRPATH));
  198.     path->next = NULL;
  199.     if (dphd is NULL) dphd = path; else p->next = path;
  200.     p = path;
  201.  
  202.     parse();
  203.     st = port->fld[0];
  204.     path->flags = 0;
  205.     path->id = *st++;
  206.     while(*st)
  207.     {
  208.       switch(*st)
  209.       {
  210.    case 'D': path->flags setbit dp_dnload; break;
  211.    case 'U': path->flags setbit dp_upload; break;
  212.    default : ;
  213.       }
  214.       st++;
  215.     }
  216.     path->path = rdstrnl();
  217.     path->name = rdstrnl();
  218.  
  219.     fgets(port->line, linelen, port->fl);
  220.   }
  221. }
  222.  
  223. /*
  224.  *  Read the port definition section of the configuration file.
  225.  */
  226. #ifdef MCH_AMIGA
  227. /* NOTE - that this routine is now executed BEFORE the window is opened
  228.    and so any information it prints must be done with printf ... NOT with
  229.    ttputs or ttputc.
  230. */
  231. #endif
  232.  
  233. rdports()
  234. {
  235.   register PORTS *p, *pt;
  236.   register char *st;
  237.   short first = true;
  238. #ifndef MCH_AMIGA
  239.   word mask = 0x0000000000000001;
  240. #else
  241.   word mask = 1;
  242. #endif
  243.   word pflg;
  244.   p_window = 0;
  245.  
  246.   pt = porthd;
  247.   fgets (port->line, linelen, port->fl);
  248.   while (!iseof(port->line))
  249.   {
  250. #ifdef MCH_AMIGA
  251. /* If this is 'mb' then only read the console port and the port we are
  252.    going to be connected to.
  253.    If this is sysop, then read all of them so that the A command can work.
  254. */
  255. #ifndef MCH_SYSOP
  256.    st = port->line;
  257.    if((toupper(*st) != 'Z') && (toupper(*st) != hostport)) {
  258.       fgets (port->line, linelen, port->fl);
  259.       fgets (port->line, linelen, port->fl);
  260.       continue;
  261.    }
  262. #endif
  263. #endif
  264.     parse();
  265.  
  266.     if (!first)
  267.     {
  268.       pt = (PORTS *) malloc(sizeof(PORTS));
  269.       pt->cmd  = (char *)malloc(cmdlen);
  270.       pt->line = (char *)malloc(linelen);
  271.       p->next = pt;
  272.     }
  273.  
  274.     first = false;
  275.     p = pt;
  276.     pt->next = NULL;
  277.  
  278.     p->mode = idle;
  279.     p->lport = NULL;
  280.  
  281.     pt->user = (USER *)malloc(sizeof(USER));
  282.     pt->user->rn = 0;
  283.  
  284.     pt->mmhs = (MSG_HDR *)malloc(sizeof(MSG_HDR));
  285.     pt->mmhs->rn = 0;
  286.  
  287.     pt->cmdcnt = 0;
  288.     pt->msg = NULL;
  289.  
  290.     st = port->fld[0];
  291.     pt->dev    = 0;
  292.     pt->priv   = 0;
  293.     pt->flags  = p_give | p_dotmr;
  294.     pt->ecmon  = false;
  295.     pt->eccmds = false;
  296.     pt->ecuser = false;
  297.     pt->tmode  = false;
  298. #ifndef MCH_AMIGA
  299.     pt->id     = *st++;
  300. #else
  301.     pt->id     = toupper(*st++);
  302. #endif
  303.     pt->idn    = (int)(pt->id - 'A');
  304.     if (pt->idn < 16) p_window setbit (mask << pt->idn);
  305.     while(*st)
  306.     {
  307.       switch(*st)
  308.       {
  309. /*
  310.  *  Device type.
  311.  */
  312.    case 'C': pt->dev = p_console; cport = pt; break;
  313.    case 'S': pt->dev = p_serial;  break;
  314.    case 'T': pt->dev = p_tnc;     break;
  315. #ifdef MCH_AMIGA
  316.    case 'N': pt->dev = p_nulmdm;  break;
  317. #endif
  318. /*
  319.  *  Device characteristics.
  320.  */
  321.    case 'E': pt->flags setbit p_echo;   break;
  322.    case 'L': pt->flags setbit p_lf;     break;
  323.    case '1': pt->ecmon  = true;         break;
  324.    case '2': pt->ecuser = true;         break;
  325.    case '3': pt->eccmds = true;         break;
  326.    case 'X': pt->tmode  = true;         break;
  327. /*
  328.  *  Port priveleges and permissions.
  329.  */
  330.    case 'B': pt->priv setbit p_bbs;     break;
  331.    case 'D': pt->priv setbit p_dnload;  break;
  332.    case 'G': pt->priv setbit p_gate;    break;
  333.    case 'I': pt->priv setbit p_ilcal;   break;
  334.    case 'M': pt->priv setbit p_mon;     break;
  335.    case 'R': pt->priv setbit p_sysop;   break;
  336.    case 'U': pt->priv setbit p_upload;  break;
  337. #ifdef MCH_AMIGA
  338.    /* Turn off one of my optional fixes */
  339.          case '#':
  340.            st++;
  341.            if((toupper(*st) >= 'A') && (toupper(*st) <= ('A' + NUMOPTS-1))){
  342.               optflags[toupper(*st) - 'A'] = 0;
  343.            }
  344.            break;
  345. #endif
  346.       }
  347.       st++;
  348.     }
  349.     pt->mode   = idle;
  350.     pt->ctime  = atoi(port->fld[1]);
  351.     pt->dtime  = atoi(port->fld[2]);
  352.     pt->mtime  = atoi(port->fld[3]);
  353.     pt->mcount = atoi(port->fld[4]);
  354.     pt->maxhrd = atoi(port->fld[5]);
  355.     pt->ndigi  = atoi(port->fld[6]);
  356.     pt->fwdmin = atoi(port->fld[7]);
  357.     pt->errmax = atoi(port->fld[8]);
  358.     pt->ftime  = atoi(port->fld[9]);
  359.  
  360.     pt->nhrd   = 0;
  361. #ifndef MCH_AMIGA
  362.     pt->heard  = (char *) malloc(17 * pt->maxhrd);
  363. #else
  364.     pt->heard  = (char *) malloc(ln_jstr * pt->maxhrd);
  365. #endif
  366.  
  367. #ifdef MCH_AMIGA
  368. /* If this is 'mb' then read the optional device name and unit number.
  369.    If it is already set then don't override it.
  370.    sysop ignores it because it can't address the devices anyway
  371. */
  372. #ifndef MCH_SYSOP
  373.    if(!ser_dev_name && (pt->id != 'Z')) {
  374.       if(*port->fld[10])unit = atol(port->fld[10]);
  375.       /* If unit number still not set then make it zero here so that when I
  376.          print out the unit number it won't be -1.
  377.       */
  378.       if(unit == -1)unit = 0;
  379.       if(*port->fld[11]) {
  380.          strcpy(dev_name,port->fld[11]);
  381.          strlwr(dev_name);
  382.          ser_dev_name = &dev_name[0];
  383.       }
  384.    }
  385. #endif
  386. #endif
  387.     pt->name   = rdstrnl();
  388.  
  389.     pt->ec = pt->ecmon;
  390.  
  391.     fgets(port->line, linelen, port->fl);
  392.   }
  393. #ifndef MCH_AMIGA
  394.   pflg = getp_flag();
  395.   putp_flag (pflg setbit p_window);
  396.   printf ("Window %X  port flag %X\n", p_window, pflg);
  397.  
  398.   ioinit();
  399.  
  400. /*
  401.  *  Drain any garbage from the port.
  402.  */
  403.  
  404.   for (p = porthd; p isnt NULL; p = p->next)
  405.   {
  406.     ioport(p);
  407.     switch(p->dev)
  408.     {
  409.       case p_tnc    :
  410.    while(instat()) inchar();
  411.    p->mode = remote;
  412.    if (p->tmode) p->flags setbit p_trans;
  413.    distnc();
  414.    p->mode = idle;
  415.    break;
  416.  
  417.       case p_serial :
  418.       case p_console:
  419.    while(instat()) inchar();
  420.  
  421.       default       : ;
  422.     }
  423.   }
  424. #endif
  425.  
  426. #ifndef MCH_SYSOP
  427.    /* If option C is turned off then remove the 'B', if it is there, in
  428.       the version string to prevent FBB compression.
  429.    */
  430.    if(!optflags[2]) {
  431.       st = vers;
  432.       while(*st != '-')st++;
  433.       st++;
  434.       while(*st != '-')st++;
  435.       st++;
  436.       while((*st != 'B') && (*st != ']'))st++;
  437.       if(*st == 'B') {
  438.          do {
  439.             *st = *(st+1);
  440.             st++;
  441.          } while(*st);
  442.       }
  443.    }
  444.   ioport(porthd);
  445. #else
  446.    cport->fl = port->fl;
  447.    ioport(cport);
  448. #endif
  449.   printf("\n");
  450. }
  451.  
  452. /*
  453.  *  Do the initialization. Called from mainline.
  454.  */
  455.  
  456. init(file)
  457. char *file;
  458. {
  459.   word avl;
  460. #ifdef MCH_AMIGA
  461.    word fast;
  462.    char tstr[100];
  463. #endif
  464.  
  465. /*
  466.  *  Set default system params.
  467.  */
  468.  
  469.   s_param = s_page;
  470.   s_prompt = 0;
  471. /*
  472.  *  Need structure for parse, so allocate a port.
  473.  */
  474.  
  475. #ifndef MCH_AMIGA
  476.   porthd       = (PORTS *) malloc(sizeof(PORTS));
  477.   porthd->cmd  = (char *)  malloc(cmdlen);
  478.   porthd->line = (char *)  malloc(linelen);
  479.   ioport(porthd);
  480.  
  481. /*
  482.  *  Open the configuration file.
  483.  */
  484.  
  485.   if ((port->fl = fopen(file, "r")) is NULL)
  486.   {
  487.     printf("Cannot open %s\n", file); exit(1);
  488.   }
  489.  
  490. /*
  491.  *  Read the configuration file, set everything up.
  492.  */
  493.  
  494.   rdports();
  495. #else
  496.    ioinit();   /* This was done in rdports but must be done here */
  497. #endif
  498.   rdpaths();
  499.   rdxbbs();
  500.   rdhold();
  501.   rdcnf();
  502.  
  503.   fclose(port->fl);
  504.  
  505.   ioport(cport);
  506.  
  507.   opnmon();
  508.   opnmsg();
  509.   opnusr();
  510.   opnbid();
  511.  
  512.   rduser(tcall, cport->user);
  513.  
  514. /*
  515.  *  If owners user record did not exist, make him one of the right kind.
  516.  */
  517.  
  518.   if (!cport->user->rn)
  519.   {
  520.     cport->user->options = u_bbs | u_sysop | u_local;
  521.     strncpy(cport->user->home_bbs, tcall, ln_call);
  522.     upduser(cport->user);
  523.   }
  524.  
  525.   opnlog();
  526.   log ('C','I',' ',nullstr);
  527.   logdat();
  528.  
  529. /*
  530.  *  Grab a mess of memory.
  531.  *  16k max. Leave at least 8k for heap.
  532.  */
  533.  
  534. #ifndef MCH_AMIGA
  535.   avl = _memavl();
  536.   if ( (avl - minheap) > maxscr ) scrmax = maxscr;
  537.   else scrmax = avl - minheap;
  538.   if (scrmax < minscr)
  539.   {
  540.     printf("Too little memory available.\n");
  541.     exit(1);
  542.   }
  543.   tmp = (TMP *) malloc(scrmax);
  544.   printf("[%u] %u free space, %u used.\n", log_mon, avl, scrmax + minheap);
  545. #else
  546.    /* get free space in Kb */
  547.    avl = (int)(AvailMem(MEMF_CHIP)>>10);
  548.    fast = (int)(AvailMem(MEMF_FAST)>>10);
  549.    /* Just ask for the whole 16Kb ... If it's not there try scrmin */
  550.    scrmax = maxscr;
  551.    tmp = (TMP *) malloc((size_t)maxscr);
  552.    if(tmp == 0) {
  553.       tmp = (TMP *) malloc((size_t)minscr);
  554.       scrmax = minscr;
  555.       if(tmp == 0) {
  556.          endtimer();
  557.          cleanser();
  558.          freefcb();
  559.          closeterm();
  560.          printf("Not enough memory available.\n");
  561.          exit(1);
  562.       }
  563.    }
  564.    /* amiga doesn't need a 'heap' */
  565.    sprintf(tstr,"%uKb Chip, %uKb Fast Memory. %uKb will be used.\n",
  566.                          avl,fast, scrmax >> 10);
  567.    ttputs(tstr);
  568. #endif
  569.   dirmax = scrmax / sizeof(DIRENT);
  570.   seed();
  571. #ifndef MCH_AMIGA
  572.   dosinit();
  573. #endif
  574.  
  575. /*
  576.  *  Set initial beacon text.
  577.  */
  578.  
  579.   setfwd();
  580.   clsmsg();
  581.   clsusr();
  582. #ifdef MCH_AMIGA
  583.    /* Let sysop know which of my options are set from the config.mb file.*/
  584.    printopts();
  585. #endif
  586. }
  587.  
  588. seed()
  589. {
  590.   register short curmin;
  591.   curtim(); curmin=10 * (l_time[2]-'0') + (l_time[3]-'0');
  592.   srand(curmin);
  593. }
  594. /*
  595.  *  Read the rest of the configuration file,
  596.  *  after the port and path definitions.
  597.  */
  598.  
  599. rdcnf()
  600. {
  601.   register int i;
  602.  
  603. /*
  604.  *  Login message.
  605.  */
  606.  
  607.   motd = rdmstr();
  608.  
  609. /*
  610.  *  Prompts.
  611.  */
  612.  
  613.   bbmenu = rdstr();  /* Prompt for connected bbs */
  614.   symenu = rdstr();  /* Local and remote sysop prompt */
  615.   rmenus = rdstr();  /* User prompt */
  616.  
  617. /*
  618.  *  Who are we?
  619.  */
  620.  
  621.   fgets (port->line, linelen, port->fl);
  622.   pcall (tcall, port->line);
  623.  
  624. /*
  625.  *  Where are we?
  626.  */
  627.  
  628.   qth = rdstrnl();
  629.  
  630. /*
  631.  *  Who is our name server?
  632.  */
  633.  
  634.   fgets (port->line, cmdlen, port->fl);
  635.   pcall (wpcall, port->line);
  636.  
  637. /*
  638.  *  File names and directory paths used by MailBox.
  639.  */
  640.  
  641.   helpfile = rdstrnl();
  642.   infofile = rdstrnl();
  643.   fwdfile  = rdstrnl();
  644.   lgfile   = rdstrnl();
  645.   monfile  = rdstrnl();
  646.   mbfile   = rdstrnl();
  647.   mbbfile  = rdstrnl();
  648.   usfile   = rdstrnl();
  649.   usbfile  = rdstrnl();
  650.   msgdir   = rdstrnl();
  651.   bidfile  = rdstrnl();
  652.   hrdfile  = rdstrnl();
  653.   stfile   = rdstrnl();
  654. #ifdef MCH_AMIGA
  655.    /* Change some of the above filenames so that they include the port id */
  656.    portfile();
  657. #endif
  658.  
  659.   hrdmax   = rdnumb();
  660.  
  661. /*
  662.  *  Automatic mail untangle at what hour?
  663.  *  NO or YES hh  Where hh is the untangle hour 0-23
  664.  */
  665.  
  666.   if (kw())
  667.   {
  668.   s_param setbit s_unt;
  669.   unt_hr = atoi(port->fld[1]);
  670.   }
  671.  
  672. /*
  673.  *  Give time slice back to DESQview?
  674.  */
  675.  
  676.   if (kw()) s_flag setbit s_dv;
  677. #ifdef MCH_AMIGA
  678. /* The multi-user version requires this whole locking mechanism OFF
  679.    and multi-user is now the default.
  680. */
  681.    s_flag clrbit s_dv;
  682. #endif
  683.  
  684. /*
  685.  *  Prompt for user info?
  686.  */
  687.  
  688.   if (kw()) s_prompt setbit s_p_name;
  689.   if (kw()) s_prompt setbit s_p_home;
  690.   if (kw()) s_prompt setbit s_p_zip;
  691.   if (kw()) s_prompt setbit s_p_qth;
  692.  
  693. /*
  694.  *  Logging
  695.  */
  696.  
  697.   if (kw()) s_param setbit s_log_on;
  698.   if (kw()) s_param setbit s_log_gate;
  699.   if (kw()) s_param setbit s_log_file;
  700.   if (kw()) s_param setbit s_log_msg;
  701.   if (kw()) s_param setbit s_log_loc;
  702.  
  703. /*
  704.  *  Control characters.
  705.  */
  706.  
  707.   achar = cchr();
  708.   rchar = cchr();
  709.   tchar = cchr();
  710.   wchar = cchr();
  711.  
  712.   pausemsg = rdstr();
  713. /* Text for local display of user call. */
  714.   mumsg = rdstr();
  715. /* Text to send when get connect request. */
  716.   reqmsg = rdstr();
  717. /* Various "talk to the owner" texts. */
  718.   talkm1 = rdstr();
  719.   talkm2 = rdstr();
  720.   talkm3 = rdstr();
  721.   talkm4 = rdstr();
  722. /* MailBox messages. */
  723.   for (i = 0; i < num_mm; i++) mm[i] = rdstr();
  724. /* Max calls in unread mail list. */
  725.   ufwdm = rdnumb();
  726.   bfwdm = rdnumb();
  727. /* Max days for a bid file record. */
  728.   bidnum = atoi(port->fld[1]);
  729. /* Kill regular message after forward? */
  730.   if (kw()) s_param setbit s_kill;
  731. /* Kill F message after forward? */
  732.   if (kw()) s_param setbit s_fkill;
  733. /* Generate service msg after KT? */
  734.   if (kw()) s_param setbit s_svc;
  735. /* Enable ET command? */
  736.   if (kw()) s_param setbit s_edtfc;
  737.   if (*port->fld[1] is 'Y') s_param setbit s_ping;
  738.  
  739. /* How many days before a message becomes stale */
  740.   tstaleb = rdnumb();
  741.   if(*port->fld[1] is 'Y') s_flag setbit s_bkill;
  742.   tstale1 = atoi (port->fld[2]);      /* 1st time period days  */
  743.   rstale1 = atoi (port->fld[3]);      /* 1st period read count */
  744.   tstale2 = atoi (port->fld[4]);      /* 2nd time period days  */
  745.   rstale2 = atoi (port->fld[5]);      /* 2nd period read count */
  746.   tstale3 = atoi (port->fld[6]);      /* 3rd time period days  */
  747.   rstale3 = atoi (port->fld[7]);      /* 3rd period read count */
  748.  
  749.   tstalen = rdnumb(); if(*port->fld[1] is 'Y') s_flag setbit s_nkill;
  750.   tstaleu = rdnumb(); if(*port->fld[1] is 'Y') s_flag setbit s_ukill;
  751.  
  752. /* Upload/download prompts. */
  753.   fm = rdstr();
  754. /* User file text. */
  755.   for (i = 0; i < num_um; i++) um[i] = rdstr();
  756.   remnl(um[0]);
  757. /* Error/status messages. */
  758.   mcant  = rdstr();
  759.   mfind  = rdstr();
  760.   mprot  = rdstr();
  761.   mexst  = rdstr();
  762.   mtime  = rdstr();
  763.   mwhat  = rdstr();
  764.   mdone  = rdstr();
  765.   mnport = rdstr();
  766.   mndir  = rdstr();
  767.   mnfile = rdstr();
  768.   mnmsg  = rdstr();
  769.   minuse = rdstr();
  770. #ifdef MCH_AMIGA
  771. #endif
  772. #ifdef NEWPASS
  773.    numpass = initpwd();
  774. sprintf(tmpstr,"NUMPASS = %d\n",numpass);
  775. ttputs(tmpstr);
  776. #else
  777.   keylst = rdstr();
  778. #endif
  779. }
  780.  
  781. #ifdef MCH_AMIGA
  782. printopts()
  783. {
  784.    register int i;
  785.    register char flag;
  786.    flag = 0;
  787.    for(i=0;i<NUMOPTS;i++) {
  788.       if(optflags[i] == 0) {
  789.          if(flag == 0) {
  790.             ttputs("\nThe following options are turned OFF - ");
  791.             flag = 1;
  792.          }
  793.          ttputc('A'+i);
  794.       }
  795.    }
  796.    if(flag) {
  797.       ttputc('\n');
  798.    }
  799. }
  800.  
  801. setinit(file)
  802. char *file;
  803. {
  804.  
  805. /* On the AMIGA opening the config file and doing rdports() are done
  806.    before the window and serial ports are opened to allow the user to
  807.    set configuration options which may affect the opening of the
  808.    window or serial port.
  809. */
  810.   porthd       = (PORTS *) malloc(sizeof(PORTS));
  811.   porthd->cmd  = (char *)  malloc((size_t)cmdlen);
  812.   porthd->line = (char *)  malloc((size_t)linelen);
  813.   ioport(porthd);
  814. /*
  815.  *  Open the configuration file.
  816.  */
  817.  
  818.   if ((port->fl = fopen(file, "r")) is NULL)
  819.   {
  820.    printf("Missing config file - ");
  821.     printf("Cannot open %s\n", file); return(1);
  822.   }
  823.  
  824. /*
  825.  *  Read the configuration file, set everything up.
  826.  */
  827.  
  828.   rdports();
  829.    return(0);
  830. }
  831. #endif
  832.